package com.huyi.common.exception;

import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.ServletWebRequest;

import com.alibaba.fastjson.JSONObject;
import com.huyi.common.result.APIResponse;
import com.huyi.common.result.enums.ResultEnum;

import lombok.extern.slf4j.Slf4j;

/**
 * 自定义异常处理类
 * 注意：一般项目分对外api接口和后台页面，统一异常处理需要分开处理
 * 	1、对外api接口一般返回code、message
 *  2、后台页面接口一般报错调整页面或者特定code、message
 * 可以针对某个包下处理@ControllerAdvice(basePackages = "com.demo") 
 * 
 * @author shengli.hu
 *
 */
@Slf4j
@ControllerAdvice(basePackages = "com.huyi.web.controller") 
public class ExceptionHandle {

	/**
	 * 拦截所有异常类
	 * 
	 * @param e
	 * @return
	 */
	@ExceptionHandler(value = Exception.class)
	@ResponseBody
	public JSONObject handle(Exception e, final ServletWebRequest req) {
		// 捕获validate验证异常
		if (e instanceof MethodArgumentNotValidException) {
			MethodArgumentNotValidException validException = (MethodArgumentNotValidException) e;
			BindingResult bindingResult = validException.getBindingResult();
			if (bindingResult.hasErrors()) {
				FieldError fieldError = bindingResult.getFieldError();
				String validMsg = fieldError.getDefaultMessage();
				return APIResponse.returnError(validMsg);
			}
		}
		
		// 自定义异常类捕捉处理
		if (e instanceof BizException) {
			BizException bizException = (BizException) e;
			Integer code = bizException.getCode();
			String msg = bizException.getMsg();
			return APIResponse.returnError(code, msg);
		}
		// 系统异常通用处理
		String url = req.getRequest().getServletPath();
		log.error("【系统异常】接口url：{},原因：{}", url, e.getMessage());
		return APIResponse.returnEnum(ResultEnum.UNKONW_ERROR);
	}

}
